home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Pascal / Applications / NIH Image 1.55 / Source / Macros2.p < prev    next >
Encoding:
Text File  |  1994-04-25  |  45.8 KB  |  1,892 lines  |  [TEXT/PJMM]

  1. unit Macros2;
  2. {Loads macro files into memory and converts them into a token stream}
  3. {that is interpreted by the routines in macros1.p.}
  4.  
  5.  
  6. interface
  7.  
  8.     uses
  9.         QuickDraw, Palettes, PrintTraps, Globals, Utilities, Graphics, File2;{}
  10. {,UMacroDef, UMacroRun;}
  11.  
  12.     procedure LoadMacrosFromFile (fname: str255; RefNum: integer);
  13.     procedure LoadMacros;
  14.  
  15.  
  16. implementation
  17.  
  18.     type
  19.         MacroBufType = packed array[0..MaxMacroFileSize] of char;
  20.         MacroBufPtr = ^MacroBufType;
  21.     var
  22.         PC2, StartOfLine: integer;
  23.         MacroBufP: MacroBufPtr;
  24.  
  25.  
  26.     procedure InitSymbolTable;
  27.         var
  28.             i: integer;
  29.     begin
  30.         with MacrosP^ do begin
  31.                 for i := 1 to MaxSymbols do
  32.                     with SymbolTable[i] do begin
  33.                             tType := CommandT;
  34.                             cType := NullC;
  35.                             loc := 0;
  36.                         end;
  37.  
  38.                 with SymbolTable[1] do begin
  39.                         symbol := 'begin       ';
  40.                         tType := BeginT;
  41.                     end;
  42.                 with SymbolTable[2] do begin
  43.                         symbol := 'convolve    ';
  44.                         cType := ConvolveC;
  45.                     end;
  46.                 with SymbolTable[3] do begin
  47.                         symbol := 'fill        ';
  48.                         cType := FillC;
  49.                     end;
  50.                 with SymbolTable[4] do begin
  51.                         symbol := 'selectall   ';
  52.                         cType := SelectC;
  53.                     end;
  54.                 with SymbolTable[5] do begin
  55.                         symbol := 'invert      ';
  56.                         cType := InvertC;
  57.                     end;
  58.                 with SymbolTable[6] do begin
  59.                         symbol := 'killroi     ';
  60.                         cType := KillC;
  61.                     end;
  62.                 with SymbolTable[7] do begin
  63.                         symbol := 'markselectio';
  64.                         cType := MarkC;
  65.                     end;
  66.                 with SymbolTable[8] do begin
  67.                         symbol := 'drawboundary';
  68.                         cType := FrameC;
  69.                     end;
  70.                 with SymbolTable[9] do begin
  71.                         symbol := 'measure     ';
  72.                         cType := MeasureC;
  73.                     end;
  74.                 with SymbolTable[10] do begin
  75.                         symbol := 'fliphorizont';
  76.                         cType := FliphC;
  77.                     end;
  78.                 with SymbolTable[11] do begin
  79.                         symbol := 'analyzeparti';
  80.                         cType := AnalyzeC;
  81.                     end;
  82.                 with SymbolTable[12] do begin
  83.                         symbol := 'nextwindow  ';
  84.                         cType := NextC;
  85.                     end;
  86.                 with SymbolTable[13] do begin
  87.                         symbol := 'paste       ';
  88.                         cType := PasteC;
  89.                     end;
  90.                 with SymbolTAble[14] do begin
  91.                         symbol := 'clear       ';
  92.                         cType := ClearC;
  93.                     end;
  94.                 with SymbolTable[15] do begin
  95.                         symbol := 'copy        ';
  96.                         cType := CopyC;
  97.                     end;
  98.                 with SymbolTable[16] do begin
  99.                         symbol := 'restoreroi  ';
  100.                         cType := RestoreC;
  101.                     end;
  102.                 with SymbolTable[17] do begin
  103.                         symbol := 'setthreshold';
  104.                         cType := ThresholdC;
  105.                     end;
  106.                 with SymbolTable[18] do begin
  107.                         symbol := 'resetgraymap';
  108.                         cType := ResetgmC;
  109.                     end;
  110.                 with SymbolTable[19] do begin
  111.                         symbol := 'makebinary  ';
  112.                         cType := MakeBinC;
  113.                     end;
  114.                 with SymbolTable[20] do begin
  115.                         symbol := 'dither      ';
  116.                         cType := DitherC;
  117.                     end;
  118.                 with SymbolTable[21] do begin
  119.                         symbol := 'smooth      ';
  120.                         cType := SmoothC;
  121.                     end;
  122.                 with SymbolTable[22] do begin
  123.                         symbol := 'scalemath   ';
  124.                         cType := ScaleMathC;
  125.                     end;
  126.                 with SymbolTable[23] do begin
  127.                         symbol := 'sharpen     ';
  128.                         cType := SharpenC;
  129.                     end;
  130.                 with SymbolTable[24] do begin
  131.                         symbol := 'inverty     ';
  132.                         cType := InvertYC;
  133.                     end;
  134.                 with SymbolTable[25] do begin
  135.                         symbol := 'calibrated  ';
  136.                         tType := FunctionT;
  137.                         cType := CalibratedC;
  138.                     end;
  139.                 with SymbolTable[26] do begin
  140.                         symbol := 'divide      ';
  141.                         cType := DivC;
  142.                     end;
  143.                 with SymbolTable[27] do begin
  144.                         symbol := 'redirect    ';
  145.                         cType := RedirectC;
  146.                     end;
  147.                 with SymbolTable[28] do begin
  148.                         symbol := 'getresults  ';
  149.                         cType := GetResultsC;
  150.                     end;
  151.                 with SymbolTable[29] do begin
  152.                         symbol := 'wait        ';
  153.                         cType := WaitC;
  154.                     end;
  155.                 with SymbolTable[30] do begin
  156.                         symbol := 'resetcounter';
  157.                         cType := ResetmC;
  158.                     end;
  159.                 with SymbolTable[31] do begin
  160.                         symbol := 'setdensitysl';
  161.                         cType := SetSliceC;
  162.                     end;
  163.                 with SymbolTable[32] do begin
  164.                         symbol := 'undo        ';
  165.                         cType := UndoC;
  166.                     end;
  167.                 with SymbolTable[33] do begin
  168.                         symbol := 'setforegroun';
  169.                         cType := SetForeC;
  170.                     end;
  171.                 with SymbolTable[34] do begin
  172.                         symbol := 'setbackgroun';
  173.                         cType := SetBackC;
  174.                     end;
  175.                 with SymbolTable[35] do begin
  176.                         symbol := 'scaleandrota';
  177.                         cType := ScaleC;
  178.                     end;
  179.                 with SymbolTable[36] do begin
  180.                         symbol := 'rotateright ';
  181.                         cType := RotateRC;
  182.                     end;
  183.                 with SymbolTable[37] do begin
  184.                         symbol := 'rotateleft  ';
  185.                         cType := RotateLC;
  186.                     end;
  187.                 with SymbolTable[38] do begin
  188.                         symbol := 'traceedges  ';
  189.                         cType := TraceC;
  190.                     end;
  191.                 with SymbolTable[39] do begin
  192.                         symbol := 'multiply    ';
  193.                         cType := MulC;
  194.                     end;
  195.                 with SymbolTable[40] do begin
  196.                         symbol := 'showhistogra';
  197.                         cType := HistoC;
  198.                     end;
  199.                 with SymbolTable[41] do begin
  200.                         symbol := 'enhancecontr';
  201.                         cType := EnhanceC;
  202.                     end;
  203.                 with SymbolTable[42] do begin
  204.                         symbol := 'equalizehist';
  205.                         cType := EqualizeC;
  206.                     end;
  207.                 with SymbolTable[43] do begin
  208.                         symbol := 'erode       ';
  209.                         cType := ErodeC;
  210.                     end;
  211.                 with SymbolTable[44] do begin
  212.                         symbol := 'dilate      ';
  213.                         cType := DilateC;
  214.                     end;
  215.                 with SymbolTable[45] do begin
  216.                         symbol := 'outline     ';
  217.                         cType := OutlineC;
  218.                     end;
  219.                 with SymbolTable[46] do begin
  220.                         symbol := 'skeletonize ';
  221.                         cType := ThinC;
  222.                     end;
  223.                 with SymbolTable[47] do begin
  224.                         symbol := 'addconstant ';
  225.                         cType := AddConstC;
  226.                     end;
  227.                 with SymbolTable[48] do begin
  228.                         symbol := 'reverttosave';
  229.                         cType := RevertC;
  230.                     end;
  231.                 with SymbolTable[49] do begin
  232.                         symbol := 'shadow      ';
  233.                         cType := ShadowC;
  234.                     end;
  235.                 with SymbolTable[50] do begin
  236.                         symbol := 'flipvertical';
  237.                         cType := FlipvC;
  238.                     end;
  239.                 with SymbolTable[51] do begin
  240.                         symbol := 'end         ';
  241.                         tType := EndT;
  242.                     end;
  243.                 with SymbolTable[52] do begin
  244.                         symbol := 'getline     ';
  245.                         cType := GetLineC;
  246.                     end;
  247.                 with SymbolTable[53] do begin
  248.                         symbol := 'var         ';
  249.                         tType := VarT;
  250.                     end;
  251.                 with SymbolTable[54] do begin
  252.                         symbol := 'for         ';
  253.                         tType := ForT;
  254.                     end;
  255.                 with SymbolTable[55] do begin
  256.                         symbol := 'integer     ';
  257.                         tType := IntegerT;
  258.                     end;
  259.                 with SymbolTable[56] do begin
  260.                         symbol := 'to          ';
  261.                         tType := ToT;
  262.                     end;
  263.                 with SymbolTable[57] do begin
  264.                         symbol := 'do          ';
  265.                         tType := DoT;
  266.                     end;
  267.                 with SymbolTable[58] do begin
  268.                         symbol := 'beep        ';
  269.                         cType := BeepC;
  270.                     end;
  271.                 with SymbolTable[59] do begin
  272.                         symbol := 'capture     ';
  273.                         cType := CaptureC;
  274.                     end;
  275.                 with SymbolTable[60] do begin
  276.                         symbol := 'makeroi     ';
  277.                         cType := MakeC;
  278.                     end;
  279.                 with SymbolTable[61] do begin
  280.                         symbol := 'moveroi     ';
  281.                         cType := MoveC;
  282.                     end;
  283.                 with SymbolTable[62] do begin
  284.                         symbol := 'insetroi    ';
  285.                         cType := InsetC;
  286.                     end;
  287.                 with SymbolTable[63] do begin
  288.                         symbol := 'moveto      ';
  289.                         cType := MoveToC;
  290.                     end;
  291.                 with SymbolTable[64] do begin
  292.                         symbol := 'drawtext    ';
  293.                         cType := DrawTextC;
  294.                     end;
  295.                 with SymbolTable[65] do begin
  296.                         symbol := 'setfont     ';
  297.                         cType := SetFontC;
  298.                     end;
  299.                 with SymbolTable[66] do begin
  300.                         symbol := 'setfontsize ';
  301.                         cType := SetFontSizeC;
  302.                     end;
  303.                 with SymbolTable[67] do begin
  304.                         symbol := 'settext     ';
  305.                         cType := SetTextC;
  306.                     end;
  307.                 with SymbolTable[68] do begin
  308.                         symbol := 'drawnumber  ';
  309.                         cType := DrawNumC;
  310.                     end;
  311.                 with SymbolTable[69] do begin
  312.                         symbol := 'or          ';
  313.                         tType := orOp;
  314.                     end;
  315.                 with SymbolTable[70] do begin
  316.                         symbol := 'and         ';
  317.                         tType := andOp;
  318.                     end;
  319.                 with SymbolTable[71] do begin
  320.                         symbol := 'div         ';
  321.                         tType := IntDivOp;
  322.                     end;
  323.                 with SymbolTable[72] do begin
  324.                         symbol := 'mod         ';
  325.                         tType := modOp;
  326.                     end;
  327.                 with SymbolTable[73] do begin
  328.                         symbol := 'getpicsize  ';
  329.                         cType := GetPicSizeC;
  330.                     end;
  331.                 with SymbolTable[74] do begin
  332.                         symbol := 'putmessage  ';
  333.                         cType := PutMsgC;
  334.                     end;
  335.                 with SymbolTable[75] do begin
  336.                         symbol := 'exit        ';
  337.                         cType := ExitC;
  338.                     end;
  339.                 with SymbolTable[76] do begin
  340.                         symbol := 'if          ';
  341.                         tType := ifT;
  342.                     end;
  343.                 with SymbolTable[77] do begin
  344.                         symbol := 'then        ';
  345.                         tType := thenT;
  346.                     end;
  347.                 with SymbolTable[78] do begin
  348.                         symbol := 'else        ';
  349.                         tType := elseT;
  350.                     end;
  351.                 with SymbolTable[79] do begin
  352.                         symbol := 'while       ';
  353.                         tType := whileT;
  354.                     end;
  355.                 with SymbolTable[80] do begin
  356.                         symbol := 'repeat      ';
  357.                         tType := repeatT;
  358.                     end;
  359.                 with SymbolTable[81] do begin
  360.                         symbol := 'until       ';
  361.                         tType := untilT;
  362.                     end;
  363.                 with SymbolTable[82] do begin
  364.                         symbol := 'not         ';
  365.                         tType := NotOp;
  366.                     end;
  367.                 with SymbolTable[83] do begin
  368.                         symbol := 'getroi      ';
  369.                         cType := GetRoiC;
  370.                     end;
  371.                 with SymbolTable[84] do begin
  372.                         symbol := 'real        ';
  373.                         tType := RealT;
  374.                     end;
  375.                 with SymbolTable[85] do begin
  376.                         symbol := 'trunc       ';
  377.                         tType := FunctionT;
  378.                         cType := TruncC;
  379.                     end;
  380.                 with SymbolTable[86] do begin
  381.                         symbol := 'round       ';
  382.                         tType := FunctionT;
  383.                         cType := RoundC;
  384.                     end;
  385.                 with SymbolTable[87] do begin
  386.                         symbol := 'getnumber   ';
  387.                         tType := FunctionT;
  388.                         cType := GetNumC;
  389.                     end;
  390.                 with SymbolTable[88] do begin
  391.                         symbol := 'nop         ';
  392.                         cType := NopC;
  393.                     end;
  394.                 with SymbolTable[89] do begin
  395.                         symbol := 'random      ';
  396.                         tType := FunctionT;
  397.                         cType := RandomC;
  398.                     end;
  399.                 with SymbolTable[90] do begin
  400.                         symbol := 'makeovalroi ';
  401.                         cType := MakeOvalC;
  402.                     end;
  403.                 with SymbolTable[91] do begin
  404.                         symbol := 'drawscale   ';
  405.                         cType := DrawScaleC;
  406.                     end;
  407.                 with SymbolTable[92] do begin
  408.                         symbol := 'setpalette  ';
  409.                         cType := SetPaletteC;
  410.                     end;
  411.                 with SymbolTable[93] do begin
  412.                         symbol := 'makenewwindo';
  413.                         cType := MakeNewC;
  414.                     end;
  415.                 with SymbolTable[94] do begin
  416.                         symbol := 'getpixel    ';
  417.                         tType := FunctionT;
  418.                         cType := GetPixelC;
  419.                     end;
  420.                 with SymbolTable[95] do begin
  421.                         symbol := 'button      ';
  422.                         tType := FunctionT;
  423.                         cType := ButtonC;
  424.                     end;
  425.                 with SymbolTable[96] do begin
  426.                         symbol := 'odd         ';
  427.                         tType := FunctionT;
  428.                         cType := oddC;
  429.                     end;
  430.                 with SymbolTable[97] do begin
  431.                         symbol := 'abs         ';
  432.                         tType := FunctionT;
  433.                         cType := absC;
  434.                     end;
  435.                 with SymbolTable[98] do begin
  436.                         symbol := 'sqrt        ';
  437.                         tType := FunctionT;
  438.                         cType := sqrtC;
  439.                     end;
  440.                 with SymbolTable[99] do begin
  441.                         symbol := 'sin         ';
  442.                         tType := FunctionT;
  443.                         cType := sinC;
  444.                     end;
  445.                 with SymbolTable[100] do begin
  446.                         symbol := 'cos         ';
  447.                         tType := FunctionT;
  448.                         cType := cosC;
  449.                     end;
  450.                 with SymbolTable[101] do begin
  451.                         symbol := 'exp         ';
  452.                         tType := FunctionT;
  453.                         cType := expC;
  454.                     end;
  455.                 with SymbolTable[102] do begin
  456.                         symbol := 'ln          ';
  457.                         tType := FunctionT;
  458.                         cType := lnC;
  459.                     end;
  460.                 with SymbolTable[103] do begin
  461.                         symbol := 'arctan      ';
  462.                         tType := FunctionT;
  463.                         cType := arctanC;
  464.                     end;
  465.                 with SymbolTable[104] do begin
  466.                         symbol := 'sqr         ';
  467.                         tType := FunctionT;
  468.                         cType := sqrC;
  469.                     end;
  470.                 with SymbolTable[105] do begin
  471.                         symbol := 'macro       ';
  472.                         tType := MacroT;
  473.                     end;
  474.                 with SymbolTable[106] do begin
  475.                         symbol := 'procedure   ';
  476.                         tType := ProcIdT;
  477.                     end;
  478.                 with SymbolTable[107] do begin
  479.                         symbol := 'open        ';
  480.                         cType := openC;
  481.                     end;
  482.                 with SymbolTable[108] do begin
  483.                         symbol := 'setimport   ';
  484.                         cType := SetImportC;
  485.                     end;
  486.                 with SymbolTable[109] do begin
  487.                         symbol := 'import      ';
  488.                         cType := ImportC;
  489.                     end;
  490.                 with SymbolTable[110] do begin
  491.                         symbol := 'setimportmin';
  492.                         cType := SetMinMaxC;
  493.                     end;
  494.                 with SymbolTable[111] do begin
  495.                         symbol := 'setcustom   ';
  496.                         cType := SetCustomC;
  497.                     end;
  498.                 with SymbolTable[112] do begin
  499.                         symbol := 'npics       ';
  500.                         tType := FunctionT;
  501.                         cType := nPicsC;
  502.                     end;
  503.                 with SymbolTable[113] do begin
  504.                         symbol := 'selectpic   ';
  505.                         cType := SelectPicC;
  506.                     end;
  507.                 with SymbolTable[114] do begin
  508.                         symbol := 'setpicname  ';
  509.                         cType := SetPicNameC;
  510.                     end;
  511.                 with SymbolTable[115] do begin
  512.                         symbol := 'applylut    ';
  513.                         cType := ApplyLutC;
  514.                     end;
  515.                 with SymbolTable[116] do begin
  516.                         symbol := 'multiplybyco';
  517.                         cType := MulConstC;
  518.                     end;
  519.                 with SymbolTable[117] do begin
  520.                         symbol := 'setnewsize  ';
  521.                         cType := SetSizeC;
  522.                     end;
  523.                 with SymbolTable[118] do begin
  524.                         symbol := 'save        ';
  525.                         cType := SaveC;
  526.                     end;
  527.                 with SymbolTable[119] do begin
  528.                         symbol := 'saveall     ';
  529.                         cType := SaveAllC;
  530.                     end;
  531.                 with SymbolTable[120] do begin
  532.                         symbol := 'saveas      ';
  533.                         cType := SaveAsC;
  534.                     end;
  535.                 with SymbolTable[121] do begin
  536.                         symbol := 'copyresults ';
  537.                         cType := CopyResultsC;
  538.                     end;
  539.                 with SymbolTable[122] do begin
  540.                         symbol := 'boolean     ';
  541.                         tType := BooleanT;
  542.                     end;
  543.                 with SymbolTable[123] do begin
  544.                         symbol := 'true        ';
  545.                         tType := TrueT;
  546.                     end;
  547.                 with SymbolTable[124] do begin
  548.                         symbol := 'false       ';
  549.                         tType := FalseT;
  550.                     end;
  551.                 with SymbolTable[125] do begin
  552.                         symbol := 'close       ';
  553.                         cType := CloseC;
  554.                     end;
  555.                 with SymbolTable[126] do begin
  556.                         symbol := 'dispose     ';
  557.                         cType := DisposeC;
  558.                     end;
  559.                 with SymbolTable[127] do begin
  560.                         symbol := 'disposeall  ';
  561.                         cType := DisposeAllC;
  562.                     end;
  563.                 with SymbolTable[128] do begin
  564.                         symbol := 'duplicate   ';
  565.                         cType := DupC;
  566.                     end;
  567.                 with SymbolTable[129] do begin
  568.                         symbol := 'getinfo     ';
  569.                         cType := GetInfoC;
  570.                     end;
  571.                 with SymbolTable[130] do begin
  572.                         symbol := 'print       ';
  573.                         cType := PrintC;
  574.                     end;
  575.                 with SymbolTable[131] do begin
  576.                         symbol := 'lineto      ';
  577.                         cType := LineToC;
  578.                     end;
  579.                 with SymbolTable[132] do begin
  580.                         symbol := 'setplotlabel';
  581.                         cType := SetLabelsC;
  582.                     end;
  583.                 with SymbolTable[133] do begin
  584.                         symbol := 'setplotscale';
  585.                         cType := SetPlotScaleC;
  586.                     end;
  587.                 with SymbolTable[134] do begin
  588.                         symbol := 'setplotsize ';
  589.                         cType := SetDimC;
  590.                     end;
  591.                 with SymbolTable[135] do begin
  592.                         symbol := 'setscaling  ';
  593.                         cType := ScalingOptionsC;
  594.                     end;
  595.                 with SymbolTable[136] do begin
  596.                         symbol := 'columnaverag';
  597.                         cType := ColumnC;
  598.                     end;
  599.                 with SymbolTable[137] do begin
  600.                         symbol := 'setchannel  ';
  601.                         cType := ChannelC;
  602.                     end;
  603.                 with SymbolTable[138] do begin
  604.                         symbol := 'showpastecon';
  605.                         cType := ShowPasteC;
  606.                     end;
  607.                 with SymbolTable[139] do begin
  608.                         symbol := 'setoption   ';
  609.                         cType := SetOptionC;
  610.                     end;
  611.                 with SymbolTable[140] do begin
  612.                         symbol := 'doand       ';
  613.                         cType := AndC;
  614.                     end;
  615.                 with SymbolTable[141] do begin
  616.                         symbol := 'door        ';
  617.                         cType := OrC;
  618.                     end;
  619.                 with SymbolTable[142] do begin
  620.                         symbol := 'doxor       ';
  621.                         cType := XorC;
  622.                     end;
  623.                 with SymbolTable[143] do begin
  624.                         symbol := 'doblend     ';
  625.                         cType := BlendC;
  626.                     end;
  627.                 with SymbolTable[144] do begin
  628.                         symbol := 'doreplace   ';
  629.                         cType := ReplaceC;
  630.                     end;
  631.                 with SymbolTable[145] do begin
  632.                         symbol := 'add         ';
  633.                         cType := AddC;
  634.                     end;
  635.                 with SymbolTable[146] do begin
  636.                         symbol := 'subtract    ';
  637.                         cType := SubC;
  638.                     end;
  639.                 with SymbolTable[147] do begin
  640.                         symbol := 'setlinewidth';
  641.                         cType := SetWidthC;
  642.                     end;
  643.                 with SymbolTable[148] do begin
  644.                         symbol := 'showresults ';
  645.                         cType := ShowResultsC;
  646.                     end;
  647.                 with SymbolTable[149] do begin
  648.                         symbol := 'startcapturi';
  649.                         cType := StartC;
  650.                     end;
  651.                 with SymbolTable[150] do begin
  652.                         symbol := 'getrow      ';
  653.                         cType := GetRowC;
  654.                     end;
  655.                 with SymbolTable[151] do begin
  656.                         symbol := 'putrow      ';
  657.                         cType := PutRowC;
  658.                     end;
  659.                 with SymbolTable[152] do begin
  660.                         symbol := 'getcolumn   ';
  661.                         cType := GetColumnC;
  662.                     end;
  663.                 with SymbolTable[153] do begin
  664.                         symbol := 'putcolumn   ';
  665.                         cType := PutColumnC;
  666.                     end;
  667.                 with SymbolTable[154] do begin
  668.                         symbol := 'allsamesize ';
  669.                         tType := FunctionT;
  670.                         cType := SameSizeC;
  671.                     end;
  672.                 with SymbolTable[155] do begin
  673.                         symbol := 'cvalue      ';
  674.                         tType := FunctionT;
  675.                         cType := cValueC;
  676.                     end;
  677.                 with SymbolTable[156] do begin
  678.                         symbol := 'plotxyz     ';
  679.                         cType := PlotXYZC;
  680.                     end;
  681.                 with SymbolTable[157] do begin
  682.                         symbol := 'includeinter';
  683.                         cType := IncludeC;
  684.                     end;
  685.                 with SymbolTable[158] do begin
  686.                         symbol := 'wandautomeas';
  687.                         cType := AutoC;
  688.                     end;
  689.                 with SymbolTable[159] do begin
  690.                         symbol := 'labelparticl';
  691.                         cType := LabelC;
  692.                     end;
  693.                 with SymbolTable[160] do begin
  694.                         symbol := 'outlineparti';
  695.                         cType := OutlineParticlesC;
  696.                     end;
  697.                 with SymbolTable[161] do begin
  698.                         symbol := 'ignorepartic';
  699.                         cType := IgnoreC;
  700.                     end;
  701.                 with SymbolTable[162] do begin
  702.                         symbol := 'adjustareas ';
  703.                         cType := AdjustC;
  704.                     end;
  705.                 with SymbolTable[163] do begin
  706.                         symbol := 'setparticles';
  707.                         cType := SetParticleSizeC;
  708.                     end;
  709.                 with SymbolTable[164] do begin
  710.                         symbol := 'setprecision';
  711.                         cType := SetPrecisionC;
  712.                     end;
  713.                 with SymbolTable[165] do begin
  714.                         symbol := 'imagemath   ';
  715.                         cType := ImageMathC;
  716.                     end;
  717.                 with SymbolTable[166] do begin
  718.                         symbol := 'pastelive   ';
  719.                         cType := PasteLiveC;
  720.                     end;
  721.                 with SymbolTable[167] do begin
  722.                         symbol := 'pidexists   ';
  723.                         tType := FunctionT;
  724.                         cType := PidExistsC;
  725.                     end;
  726.                 with SymbolTable[168] do begin
  727.                         symbol := 'pos         ';
  728.                         tType := FunctionT;
  729.                         cType := PosC;
  730.                     end;
  731.                 with SymbolTable[169] do begin
  732.                         symbol := 'delete      ';
  733.                         cType := DeleteC;
  734.                     end;
  735.                 with SymbolTable[170] do begin
  736.                         symbol := 'length      ';
  737.                         tType := FunctionT;
  738.                         cType := LengthC;
  739.                     end;
  740.                 with SymbolTable[171] do begin
  741.                         symbol := 'getscale    ';
  742.                         cType := GetScaleC;
  743.                     end;
  744.                 with SymbolTable[172] do begin
  745.                         symbol := 'autooutline ';
  746.                         cType := AutoOutlineC;
  747.                     end;
  748. {Unused entries}
  749.                 with SymbolTable[173] do begin
  750.                         symbol := 'xeasureangle';
  751.                         cType := NopC;
  752.                     end;
  753.                 with SymbolTable[174] do begin
  754.                         symbol := 'xeasureinteg';
  755.                         cType := NopC;
  756.                     end;
  757. {End unused entries}
  758.                 with SymbolTable[175] do begin
  759.                         symbol := 'putpixel    ';
  760.                         cType := PutPixelC;
  761.                     end;
  762.                 with SymbolTable[176] do begin
  763.                         symbol := 'choosepic   ';
  764.                         cType := ChoosePicC;
  765.                     end;
  766.                 with SymbolTable[177] do begin
  767.                         symbol := 'write       ';
  768.                         cType := WriteC;
  769.                     end;
  770.                 with SymbolTable[178] do begin
  771.                         symbol := 'writeln     ';
  772.                         cType := WritelnC;
  773.                     end;
  774.                 with SymbolTable[179] do begin
  775.                         symbol := 'scaleselecti';
  776.                         cType := ScaleSelectionC;
  777.                     end;
  778.                 with SymbolTable[180] do begin
  779.                         symbol := 'picnumber   ';
  780.                         tType := FunctionT;
  781.                         cType := PicNumC;
  782.                     end;
  783.                 with SymbolTable[181] do begin
  784.                         symbol := 'export      ';
  785.                         cType := ExportC;
  786.                     end;
  787.                 with SymbolTable[182] do begin
  788.                         symbol := 'reducenoise ';
  789.                         cType := ReduceC;
  790.                     end;
  791.                 with SymbolTable[183] do begin
  792.                         symbol := 'changevalues';
  793.                         cType := ChangeC;
  794.                     end;
  795.                 with SymbolTable[184] do begin
  796.                         symbol := 'histogram   ';
  797.                         tType := ArrayT;
  798.                         cType := HistogramC;
  799.                     end;
  800.                 with SymbolTable[185] do begin
  801.                         symbol := 'scaleconvolu';
  802.                         cType := ScaleConvolutionsC;
  803.                     end;
  804.                 with SymbolTable[186] do begin
  805.                         symbol := 'rarea       ';
  806.                         tType := ArrayT;
  807.                         cType := rAreaC;
  808.                     end;
  809.                 with SymbolTable[187] do begin
  810.                         symbol := 'rmean       ';
  811.                         tType := ArrayT;
  812.                         cType := rMeanC;
  813.                     end;
  814.                 with SymbolTable[188] do begin
  815.                         symbol := 'rx          ';
  816.                         tType := ArrayT;
  817.                         cType := rXC;
  818.                     end;
  819.                 with SymbolTable[189] do begin
  820.                         symbol := 'ry          ';
  821.                         tType := ArrayT;
  822.                         cType := rYC;
  823.                     end;
  824.                 with SymbolTable[190] do begin
  825.                         symbol := 'rmin        ';
  826.                         tType := ArrayT;
  827.                         cType := rMinC;
  828.                     end;
  829.                 with SymbolTable[191] do begin
  830.                         symbol := 'rmax        ';
  831.                         tType := ArrayT;
  832.                         cType := rMaxC;
  833.                     end;
  834.                 with SymbolTable[192] do begin
  835.                         symbol := 'rcount      ';
  836.                         tType := FunctionT;
  837.                         cType := rCountC;
  838.                     end;
  839.                 with SymbolTable[193] do begin
  840.                         symbol := 'updateresult';
  841.                         cType := UpdateResultsC;
  842.                     end;
  843.                 with SymbolTable[194] do begin
  844.                         symbol := 'stopcapturin';
  845.                         cType := StopC;
  846.                     end;
  847.                 with SymbolTable[195] do begin
  848.                         symbol := 'tilewindows ';
  849.                         cType := CascadeC;
  850.                     end;
  851.                 with SymbolTable[196] do begin
  852.                         symbol := 'rlength     ';
  853.                         tType := ArrayT;
  854.                         cType := rLengthC;
  855.                     end;
  856.                 with SymbolTable[197] do begin
  857.                         symbol := 'rmajor      ';
  858.                         tType := ArrayT;
  859.                         cType := rMajorC;
  860.                     end;
  861.                 with SymbolTable[198] do begin
  862.                         symbol := 'rminor      ';
  863.                         tType := ArrayT;
  864.                         cType := rMinorC;
  865.                     end;
  866.                 with SymbolTable[199] do begin
  867.                         symbol := 'rangle      ';
  868.                         tType := ArrayT;
  869.                         cType := rAngleC;
  870.                     end;
  871.                 with SymbolTable[200] do begin
  872.                         symbol := 'setmajorlabe';
  873.                         cType := SetMajorC;
  874.                     end;
  875.                 with SymbolTable[201] do begin
  876.                         symbol := 'setminorlabe';
  877.                         cType := SetMinorC;
  878.                     end;
  879.                 with SymbolTable[202] do begin
  880.                         symbol := 'getmouse    ';
  881.                         cType := GetMouseC;
  882.                     end;
  883.                 with SymbolTable[203] do begin
  884.                         symbol := 'slicenumber ';
  885.                         tType := FunctionT;
  886.                         cType := GetSliceC;
  887.                     end;
  888.                 with SymbolTable[204] do begin
  889.                         symbol := 'nslices     ';
  890.                         tType := FunctionT;
  891.                         cType := nSlicesC;
  892.                     end;
  893.                 with SymbolTable[205] do begin
  894.                         symbol := 'selectslice ';
  895.                         cType := SelectSliceC;
  896.                     end;
  897.                 with SymbolTable[206] do begin
  898.                         symbol := 'addslice    ';
  899.                         cType := AddSliceC;
  900.                     end;
  901.                 with SymbolTable[207] do begin
  902.                         symbol := 'deleteslice ';
  903.                         cType := DeleteSliceC;
  904.                     end;
  905.                 with SymbolTable[208] do begin
  906.                         symbol := 'makenewstack';
  907.                         cType := MakeStackC;
  908.                     end;
  909.                 with SymbolTable[209] do begin
  910.                         symbol := 'averageframe';
  911.                         cType := AverageFramesC;
  912.                     end;
  913.                 with SymbolTable[210] do begin
  914.                         symbol := 'waitfortrigg';
  915.                         cType := TriggerC;
  916.                     end;
  917.                 with SymbolTable[211] do begin
  918.                         symbol := 'docopy      ';
  919.                         cType := CopyModeC;
  920.                     end;
  921.                 with SymbolTable[212] do begin
  922.                         symbol := 'reslice     ';
  923.                         cType := ResliceC;
  924.                     end;
  925.                 with SymbolTable[213] do begin
  926.                         symbol := 'makelineroi ';
  927.                         cType := MakeLineC;
  928.                     end;
  929.                 with SymbolTable[214] do begin
  930.                         symbol := 'plotprofile ';
  931.                         cType := PlotProfileC;
  932.                     end;
  933.                 with SymbolTable[215] do begin
  934.                         symbol := 'gettime     ';
  935.                         cType := GetTimeC;
  936.                     end;
  937.                 with SymbolTable[216] do begin
  938.                         symbol := 'setscale    ';
  939.                         cType := SetScaleC;
  940.                     end;
  941.                 with SymbolTable[217] do begin
  942.                         symbol := 'savestate   ';
  943.                         cType := SaveStateC;
  944.                     end;
  945.                 with SymbolTable[218] do begin
  946.                         symbol := 'restorestate';
  947.                         cType := RestoreStateC;
  948.                     end;
  949.                 with SymbolTable[219] do begin
  950.                         symbol := 'setcounter  ';
  951.                         cType := SetCounterC;
  952.                     end;
  953.                 with SymbolTable[220] do begin
  954.                         symbol := 'redlut      ';
  955.                         tType := ArrayT;
  956.                         cType := RedLutC;
  957.                     end;
  958.                 with SymbolTable[221] do begin
  959.                         symbol := 'greenlut    ';
  960.                         tType := ArrayT;
  961.                         cType := GreenLutC;
  962.                     end;
  963.                 with SymbolTable[222] do begin
  964.                         symbol := 'bluelut     ';
  965.                         tType := ArrayT;
  966.                         cType := BlueLutC;
  967.                     end;
  968.                 with SymbolTable[223] do begin
  969.                         symbol := 'updatelut   ';
  970.                         cType := UpdateLutC;
  971.                     end;
  972.                 with SymbolTable[224] do begin
  973.                         symbol := 'showmessage ';
  974.                         cType := ShowMsgC;
  975.                     end;
  976.                 with SymbolTable[225] do begin
  977.                         symbol := 'setbinarycou';
  978.                         cType := SetCountC;
  979.                     end;
  980.                 with SymbolTable[226] do begin
  981.                         symbol := 'rstddev     ';
  982.                         tType := ArrayT;
  983.                         cType := rStdDevC;
  984.                     end;
  985.                 with SymbolTable[227] do begin
  986.                         symbol := 'propagatelut';
  987.                         cType := PropagateLutC;
  988.                     end;
  989.                 with SymbolTable[228] do begin
  990.                         symbol := 'chooseslice ';
  991.                         cType := ChooseSliceC;
  992.                     end;
  993.                 with SymbolTable[229] do begin
  994.                         symbol := 'setslicespac';
  995.                         cType := SetSpacingC;
  996.                     end;
  997.                 with SymbolTable[230] do begin
  998.                         symbol := 'getslicespac';
  999.                         tType := FunctionT;
  1000.                         cType := GetSpacingC;
  1001.                     end;
  1002.                 with SymbolTable[231] do begin
  1003.                         symbol := 'linebuffer  ';
  1004.                         tType := ArrayT;
  1005.                         cType := BufferC;
  1006.                     end;
  1007.                 with SymbolTable[232] do begin
  1008.                         symbol := 'ruser1      ';
  1009.                         tType := ArrayT;
  1010.                         cType := rUser1C;
  1011.                     end;
  1012.                 with SymbolTable[233] do begin
  1013.                         symbol := 'ruser2      ';
  1014.                         tType := ArrayT;
  1015.                         cType := rUser2C;
  1016.                     end;
  1017.                 with SymbolTable[234] do begin
  1018.                         symbol := 'propagateden';
  1019.                         cType := PropagateDensityC;
  1020.                     end;
  1021.                 with SymbolTable[235] do begin
  1022.                         symbol := 'propagatespa';
  1023.                         cType := PropagateSpatialC;
  1024.                     end;
  1025.                 with SymbolTable[236] do begin
  1026.                         symbol := 'setoptions  ';
  1027.                         cType := SetOptionsC;
  1028.                     end;
  1029.                 with SymbolTable[237] do begin
  1030.                         symbol := 'requiresvers';
  1031.                         cType := RequiresC;
  1032.                     end;
  1033.                 with SymbolTable[238] do begin
  1034.                         symbol := 'getplotdata ';
  1035.                         cType := GetPlotDataC;
  1036.                     end;
  1037.                 with SymbolTable[239] do begin
  1038.                         symbol := 'plotdata    ';
  1039.                         tType := ArrayT;
  1040.                         cType := PlotDataC;
  1041.                     end;
  1042.                 with SymbolTable[240] do begin
  1043.                         symbol := 'setuser1labe';
  1044.                         cType := SetUser1C;
  1045.                     end;
  1046.                 with SymbolTable[241] do begin
  1047.                         symbol := 'setuser2labe';
  1048.                         cType := SetUser2C;
  1049.                     end;
  1050.                 with SymbolTable[242] do begin
  1051.                         symbol := 'subtractback';
  1052.                         cType := SubtractBackgroundC;
  1053.                     end;
  1054.                 with SymbolTable[243] do begin
  1055.                         symbol := 'autothreshol';
  1056.                         cType := AutoThresholdC;
  1057.                     end;
  1058.                 with SymbolTable[244] do begin
  1059.                         symbol := 'setexport   ';
  1060.                         cType := SetExportC;
  1061.                     end;
  1062.                 with SymbolTable[245] do begin
  1063.                         symbol := 'movewindow  ';
  1064.                         cType := MoveWindowC;
  1065.                     end;
  1066.                 with SymbolTable[246] do begin
  1067.                         symbol := 'usercode    ';
  1068.                         cType := UserCodeC;
  1069.                     end;
  1070.                 with SymbolTable[247] do begin
  1071.                         symbol := 'invertlut   ';
  1072.                         cType := InvertLutC;
  1073.                     end;
  1074.                 with SymbolTable[248] do begin
  1075.                         symbol := 'xcoordinates';
  1076.                         tType := ArrayT;
  1077.                         cType := xCoordinatesC;
  1078.                     end;
  1079.                 with SymbolTable[249] do begin
  1080.                         symbol := 'ycoordinates';
  1081.                         tType := ArrayT;
  1082.                         cType := yCoordinatesC;
  1083.                     end;
  1084.                 with SymbolTable[250] do begin
  1085.                         symbol := 'ncoordinates';
  1086.                         tType := FunctionT;
  1087.                         cType := nCoordinatesC;
  1088.                     end;
  1089.                 with SymbolTable[251] do begin
  1090.                         symbol := 'string      ';
  1091.                         tType := StringT;
  1092.                     end;
  1093.                 with SymbolTable[252] do begin
  1094.                         symbol := 'getstring   ';
  1095.                         tType := StringFunctionT;
  1096.                         cType := GetStringC;
  1097.                     end;
  1098.                 with SymbolTable[253] do begin
  1099.                         symbol := 'openserial  ';
  1100.                         cType := OpenSerialC;
  1101.                     end;
  1102.                 with SymbolTable[254] do begin
  1103.                         symbol := 'getserial   ';
  1104.                         tType := StringFunctionT;
  1105.                         cType := GetSerialC;
  1106.                     end;
  1107.                 with SymbolTable[255] do begin
  1108.                         symbol := 'putserial   ';
  1109.                         cType := PutSerialC;
  1110.                     end;
  1111.                 with SymbolTable[256] do begin
  1112.                         symbol := 'chr         ';
  1113.                         tType := StringFunctionT;
  1114.                         cType := ChrC;
  1115.                     end;
  1116.                 with SymbolTable[257] do begin
  1117.                         symbol := 'ord         ';
  1118.                         tType := FunctionT;
  1119.                         cType := OrdC;
  1120.                     end;
  1121.                 with SymbolTable[258] do begin
  1122.                         symbol := 'setcursor   ';
  1123.                         cType := SetCursorC;
  1124.                     end;
  1125.                 with SymbolTable[259] do begin
  1126.                         symbol := 'tickcount   ';
  1127.                         tType := FunctionT;
  1128.                         cType := TickCountC;
  1129.                     end;
  1130.                 with SymbolTable[260] do begin
  1131.                         symbol := 'concat      ';
  1132.                         tType := StringFunctionT;
  1133.                         cType := ConcatC;
  1134.                     end;
  1135.                 with SymbolTable[261] do begin
  1136.                         symbol := 'setvideo    ';
  1137.                         cType := SetVideoC;
  1138.                     end;
  1139.                 with SymbolTable[262] do begin
  1140.                         symbol := 'stringtonum ';
  1141.                         tType := FunctionT;
  1142.                         cType := StringToNumC;
  1143.                     end;
  1144.                 with SymbolTable[263] do begin
  1145.                         symbol := 'acquire     ';
  1146.                         cType := AcquireC;
  1147.                     end;
  1148.                 with SymbolTable[264] do begin
  1149.                         symbol := 'undobuffersi';
  1150.                         tType := FunctionT;
  1151.                         cType := UndoSizeC;
  1152.                     end;
  1153.                 with SymbolTable[265] do begin
  1154.                         symbol := 'scion       ';
  1155.                         tType := ArrayT;
  1156.                         cType := ScionC;
  1157.                     end;
  1158.                 with SymbolTable[266] do begin
  1159.                         symbol := 'filter      ';
  1160.                         cType := FilterC;
  1161.                     end;
  1162.                 with SymbolTable[267] do begin
  1163.                         symbol := 'photomode   ';
  1164.                         cType := PhotoModeC;
  1165.                     end;
  1166.                 with SymbolTable[268] do begin
  1167.                         symbol := 'rgbtoindexed';
  1168.                         cType := RGBToIndexedC;
  1169.                     end;
  1170.                 with SymbolTable[269] do begin
  1171.                         symbol := 'surfaceplot ';
  1172.                         cType := SurfacePlotC;
  1173.                     end;
  1174.                 with SymbolTable[270] do begin
  1175.                         symbol := 'selectwindow';
  1176.                         cType := SelectWindowC;
  1177.                     end;
  1178.                 with SymbolTable[271] do begin
  1179.                         symbol := 'newtextwindo';
  1180.                         cType := NewTextWindowC;
  1181.                     end;
  1182.                 with SymbolTable[272] do begin
  1183.                         symbol := 'capturecolor';
  1184.                         cType := CaptureColorC;
  1185.                     end;
  1186.                 with SymbolTable[273] do begin
  1187.                         symbol := 'getthreshold';
  1188.                         cType := GetThresholdC;
  1189.                     end;
  1190.                 with SymbolTable[274] do begin
  1191.                         symbol := 'averageslice';
  1192.                         cType := AverageSlicesC;
  1193.                     end;
  1194.                 with SymbolTable[275] do begin
  1195.                         symbol := 'bitand      ';
  1196.                         tType := FunctionT;
  1197.                         cType := BitAndC;
  1198.                     end;
  1199.                 with SymbolTable[276] do begin
  1200.                         symbol := 'bitor       ';
  1201.                         tType := FunctionT;
  1202.                         cType := BitOrC;
  1203.                     end;
  1204.                 with SymbolTable[277] do begin
  1205.                         symbol := 'sortpalette ';
  1206.                         cType := SortPaletteC;
  1207.                     end;
  1208.                 with SymbolTable[278] do begin
  1209.                         symbol := 'pidnumber   ';
  1210.                         tType := FunctionT;
  1211.                         cType := PidNumC;
  1212.                     end;
  1213.                 with SymbolTable[279] do begin
  1214.                         symbol := 'project     ';
  1215.                         cType := ProjectC;
  1216.                     end;
  1217.                 with SymbolTable[280] do begin
  1218.                         symbol := 'windowtitle ';
  1219.                         tType := StringFunctionT;
  1220.                         cType := WindowTitleC;
  1221.                     end;
  1222.             end; {with}
  1223.         nSymbols := 280; {Must be subscript of last predefined symbol}
  1224.    {Note: there are currently 2 unused entries in the table. Search for 'Unused' to find them.}
  1225.     end;
  1226.  
  1227.  
  1228.     procedure DeallocateStrings2 (first, last: integer);
  1229.         var
  1230.             i: integer;
  1231.     begin
  1232.         with MacrosP^ do begin
  1233.                 for i := first to last do begin
  1234.                         if Stack[i].StringH <> nil then begin
  1235.                                 DisposHandle(handle(Stack[i].StringH));
  1236.                                 Stack[i].StringH := nil;
  1237.                             end;
  1238.                     end;
  1239.             end;
  1240.     end;
  1241.  
  1242.  
  1243.     function CurrentLine: str255;
  1244.         var
  1245.             cLine: str255;
  1246.             i, count: integer;
  1247.     begin
  1248.         i := StartOfLine;
  1249.         if (i < 0) or (i > EndMacros) then begin
  1250.                 CurrentLine := '';
  1251.                 exit(CurrentLine);
  1252.             end;
  1253.         cLine := '';
  1254.         count := 0;
  1255.         repeat
  1256.             i := i + 1;
  1257.             count := count + 1;
  1258.             if not (MacroBufP^[i] = cr) or (MacroBufP^[i] = '|') then
  1259.                 cLine := concat(cLine, MacroBufP^[i]);
  1260.         until (i >= EndMacros) or (MacroBufP^[i] = cr) or (MacroBufP^[i] = '|') or (count > 60);
  1261.         while (length(cLine) > 1) and (cLine[1] = ' ') do
  1262.             delete(cLine, 1, 1);
  1263.         CurrentLine := concat(cr, '<<', cLine, '>>');
  1264.     end;
  1265.  
  1266.  
  1267.     procedure LTMacroError (str: str255);
  1268.   {Report load-time errors}
  1269.         var
  1270.             str2: str255;
  1271.             i, count: integer;
  1272.     begin
  1273.         if token = DoneT then
  1274.             exit(LTMacroError);
  1275.         if TopOfStack > 0 then
  1276.             DeallocateStrings2(1, TopOfStack);
  1277.         PutMessage(concat(str, ' in line ', long2str(MacroLineNumber), ' of macro file.', CurrentLine));
  1278.         Token := DoneT;
  1279.     end;
  1280.  
  1281.  
  1282.     procedure LookupIdentifier;
  1283.         var
  1284.             i: integer;
  1285.     begin
  1286.         with MacrosP^ do
  1287.             for i := 1 to nSymbols do begin
  1288.                     if TokenSymbol = SymbolTable[i].symbol then
  1289.                         with SymbolTable[i] do begin
  1290.                                 token := tType;
  1291.                                 MacroCommand := cType;
  1292.                                 TokenLoc := loc;
  1293.                                 SymbolTableLoc := i;
  1294.                                 exit(LookupIdentifier);
  1295.                             end;
  1296.                 end; {for}
  1297.         token := UnknownIdentifier;
  1298.     end;
  1299.  
  1300.  
  1301.     procedure GetToken;
  1302.         var
  1303.             c: char;
  1304.             SymbolLength: integer;
  1305.     begin
  1306.         if token = DoneT then
  1307.             exit(GetToken);
  1308.         SavePC := PC;
  1309.         SaveToken := token;
  1310.         while not (MacroBufP^[pc] in ['a'..'z', '0'..'9', '(', ')', ',', '''', '+', '-', '*', '/', ':', ';', '=', '.', '>', '<', '[', ']', '|']) do begin  {skip white space}
  1311.                 if MacroBufP^[pc] = cr then
  1312.                     MacroBufP^[pc] := '|'
  1313.                 else
  1314.                     pc := pc + 1;
  1315.                 if pc > EndMacros then begin
  1316.                         Token := DoneT;
  1317.                         exit(GetToken);
  1318.                     end;
  1319.             end;
  1320.         c := MacroBufP^[pc];
  1321.         case c of
  1322.             'a'..'z':  begin
  1323.                     TokenSymbol := BlankSymbol;
  1324.                     SymbolLength := 0;
  1325.                     while MacroBufP^[pc] in ['a'..'z', '0'..'9'] do begin
  1326.                             SymbolLength := SymbolLength + 1;
  1327.                             if SymbolLength <= SymbolSize then
  1328.                                 TokenSymbol[SymbolLength] := MacroBufP^[pc];
  1329.                             pc := pc + 1;
  1330.                             if pc > EndMacros then begin
  1331.                                     Token := DoneT;
  1332.                                     exit(GetToken);
  1333.                                 end;
  1334.                         end;
  1335.                     Token := identifier;
  1336.                     LookupIdentifier;
  1337.                     exit(GetToken);
  1338.                 end;
  1339.             '0'..'9', '.':  begin
  1340.                     TokenStr := '';
  1341.                     while MacroBufP^[pc] in ['0'..'9', '.'] do begin
  1342.                             TokenStr := concat(TokenStr, c);
  1343.                             pc := pc + 1;
  1344.                             c := MacroBufP^[pc];
  1345.                             if pc > EndMacros then begin
  1346.                                     Token := DoneT;
  1347.                                     exit(GetToken);
  1348.                                 end;
  1349.                         end;
  1350.                     Token := NumericLiteral;
  1351.                     if MacroBufP^[pc] in ['a'..'z'] then
  1352.                         LTMacroError('Operator or delimiter expected');
  1353.                     exit(GetToken);
  1354.                 end;
  1355.             '(':  begin
  1356.                     Token := LeftParen;
  1357.                     pc := pc + 1;
  1358.                 end;
  1359.             ')':  begin
  1360.                     Token := RightParen;
  1361.                     pc := pc + 1;
  1362.                 end;
  1363.             '[':  begin
  1364.                     Token := LeftBracket;
  1365.                     pc := pc + 1;
  1366.                 end;
  1367.             ']':  begin
  1368.                     Token := RightBracket;
  1369.                     pc := pc + 1;
  1370.                 end;
  1371.             ',':  begin
  1372.                     Token := comma;
  1373.                     pc := pc + 1;
  1374.                 end;
  1375.             ':': 
  1376.                 if MacroBufP^[pc + 1] = '=' then begin
  1377.                         Token := AssignOp;
  1378.                         pc := pc + 2;
  1379.                     end
  1380.                 else begin
  1381.                         Token := colon;
  1382.                         pc := pc + 1;
  1383.                     end;
  1384.             ';':  begin
  1385.                     Token := SemiColon;
  1386.                     pc := pc + 1;
  1387.                 end;
  1388.             '+':  begin
  1389.                     Token := PlusOp;
  1390.                     pc := pc + 1;
  1391.                 end;
  1392.             '-':  begin
  1393.                     Token := MinusOp;
  1394.                     pc := pc + 1;
  1395.                 end;
  1396.             '*':  begin
  1397.                     Token := MulOp;
  1398.                     pc := pc + 1;
  1399.                 end;
  1400.             '/':  begin
  1401.                     Token := DivOp;
  1402.                     pc := pc + 1;
  1403.                 end;
  1404.             '''':  begin
  1405.                     TokenStr := '';
  1406.                     pc := pc + 1;
  1407.                     while MacroBufP^[pc] <> '''' do begin
  1408.                             TokenStr := concat(TokenStr, MacroBufP^[pc]);
  1409.                             pc := pc + 1;
  1410.                             if pc > EndMacros then begin
  1411.                                     Token := DoneT;
  1412.                                     exit(GetToken);
  1413.                                 end;
  1414.                         end;
  1415.                     pc := pc + 1;
  1416.                     Token := StringLiteral;
  1417.                 end;
  1418.             '=':  begin
  1419.                     Token := eqOp;
  1420.                     pc := pc + 1;
  1421.                 end;
  1422.             '<':  begin
  1423.                     pc := pc + 1;
  1424.                     if MacroBufP^[pc] = '>' then begin
  1425.                             token := neOp;
  1426.                             pc := pc + 1;
  1427.                         end
  1428.                     else if MacroBufP^[pc] = '=' then begin
  1429.                             token := leOp;
  1430.                             pc := pc + 1;
  1431.                         end
  1432.                     else
  1433.                         token := ltOp;
  1434.                 end;
  1435.             '>':  begin
  1436.                     pc := pc + 1;
  1437.                     if MacroBufP^[pc] = '=' then begin
  1438.                             token := geOp;
  1439.                             pc := pc + 1;
  1440.                         end
  1441.                     else
  1442.                         token := gtOp;
  1443.                 end;
  1444.             '|':  begin
  1445.                     Token := NewLineT;
  1446.                     MacroLineNumber := MacroLineNumber + 1;
  1447.                     StartOfLine := pc;
  1448.                     pc := pc + 1;
  1449.                 end;
  1450.             otherwise begin
  1451.                     token := NullT;
  1452.                     beep;
  1453.                 end;
  1454.         end; {case}
  1455.     end;
  1456.  
  1457.  
  1458.     procedure AddProcedure;
  1459.     begin
  1460.         GetToken;
  1461.         if token <> UnknownIdentifier then begin
  1462.                 LTMacroError('Procedure name missing or previously defined');
  1463.                 exit(AddProcedure);
  1464.             end;
  1465.         if nSymbols >= MaxSymbols then begin
  1466.                 LTMacroError('Symbol table overflow');
  1467.                 exit(AddProcedure);
  1468.             end;
  1469.         nSymbols := nSymbols + 1;
  1470.         nProcedures := nProcedures + 1;
  1471.         with MacrosP^, MacrosP^.SymbolTable[nSymbols] do begin
  1472.                 symbol := TokenSymbol;
  1473.                 tType := procedureT;
  1474.                 cType := NullC;
  1475.                 if MacroBufP^[pc] = ';' then
  1476.                     pc := pc + 1;
  1477.                 loc := pc2 + 1;
  1478.             end;
  1479.     end;
  1480.  
  1481.  
  1482.     procedure AddIdentifier;
  1483.     begin
  1484.         if nSymbols >= MaxSymbols then begin
  1485.                 LTMacroError('Symbol table overflow');
  1486.                 exit(AddIdentifier);
  1487.             end;
  1488.         nSymbols := nSymbols + 1;
  1489.         with MacrosP^, MacrosP^.SymbolTable[nSymbols] do begin
  1490.                 symbol := TokenSymbol;
  1491.                 tType := Identifier;
  1492.                 cType := NullC;
  1493.                 loc := pc2;
  1494.             end;
  1495.     end;
  1496.  
  1497.  
  1498.     procedure GetGDToken;
  1499.     begin
  1500.         GetToken;
  1501.         while token = NewLineT do
  1502.             GetToken;
  1503.     end;
  1504.  
  1505.  
  1506.     procedure DoGlobalDeclaration;
  1507.         var
  1508.             SaveStackLoc, StackLoc: integer;
  1509.     begin
  1510.         SaveStackLoc := TopOfStack;
  1511.         while (token = UnknownIdentifier) or (token = Identifier) do begin
  1512.                 if Token = UnknownIdentifier then begin
  1513.                         AddIdentifier;
  1514.                         SymbolTableLoc := nSymbols;
  1515.                         token := identifier;
  1516.                     end;
  1517.                 if TopOfStack >= MaxMacroStackSize then begin
  1518.                         LTMacroError(StackOverflow);
  1519.                         exit(DoGlobalDeclaration);
  1520.                     end;
  1521.                 TopOfStack := TopOfStack + 1;
  1522.                 nGlobals := nGlobals + 1;
  1523.                 with MacrosP^.stack[TopOfStack] do begin
  1524.                         SymbolTableIndex := SymbolTableLoc;
  1525.                         value := 0.0;
  1526.                         StringH := nil;
  1527.                     end;
  1528.                 GetGDToken;
  1529.                 if token = comma then
  1530.                     GetGDToken;
  1531.             end; {while}
  1532.         if token <> colon then
  1533.             LTMacroError('":" expected');
  1534.         GetGDToken;
  1535.         if (token <> IntegerT) and (token <> RealT) and (token <> BooleanT) and (token <> StringT) then
  1536.             LTMacroError('"integer", "real", "boolean" or "string" expected');
  1537.         for StackLoc := SaveStackLoc + 1 to TopOfStack do
  1538.             with macrosP^.stack[StackLoc] do
  1539.                 case token of
  1540.                     IntegerT: 
  1541.                         vType := IntVar;
  1542.                     RealT: 
  1543.                         vType := RealVar;
  1544.                     BooleanT: 
  1545.                         vType := BooleanVar;
  1546.                     StringT:  begin
  1547.                             vType := StringVar;
  1548.                             StringH := str255H(NewHandle(SizeOf(str255)));
  1549.                             if StringH = nil then begin
  1550.                                     LTMacroError('Out of memory');
  1551.                                     Token := DoneT
  1552.                                 end
  1553.                             else
  1554.                                 StringH^^ := 'Global String';
  1555.                         end;
  1556.                     otherwise
  1557.                 end;
  1558.         GetGDToken;
  1559.         if Token = SemiColon then
  1560.             GetGDToken;
  1561.     end;
  1562.  
  1563.  
  1564.     procedure PutTokenBack2;
  1565.     begin
  1566.         if token <> DoneT then begin
  1567.                 pc := SavePC;
  1568.                 token := SaveToken;
  1569.             end;
  1570.     end;
  1571.  
  1572.  
  1573.     procedure DoGlobalDeclarations;
  1574.     begin
  1575.         GetGDToken;
  1576.         while ((token = UnknownIdentifier) or (token = Identifier)) and (Token <> DoneT) do
  1577.             DoGlobalDeclaration;
  1578.         PutTokenBack2;
  1579.     end;
  1580.  
  1581.  
  1582.     function PreScan1: boolean;
  1583.    {Converts the macro file to lowercase and removes comments.}
  1584.         var
  1585.             inString, inComment: boolean;
  1586.             c: char;
  1587.             i, StartComment: integer;
  1588.  
  1589.         function LineNumber: integer;
  1590.             var
  1591.                 i, n: integer;
  1592.         begin
  1593.             n := 1;
  1594.             for i := 0 to pc do
  1595.                 if MacroBufP^[i] = cr then begin
  1596.                         StartOfLine := i;
  1597.                         n := n + 1;
  1598.                     end;
  1599.             LineNumber := n;
  1600.         end;
  1601.  
  1602.     begin
  1603.         PreScan1 := false;
  1604.         inString := false;
  1605.         inComment := false;
  1606.         for i := 0 to EndMacros do begin
  1607.                 c := MacroBufP^[i];
  1608.                 if inString and (c = cr) then begin
  1609.                         pc := i - 1;
  1610.                         PutMessage(concat('The quoted string in line ', long2str(LineNumber), ' of the macro file is not terminated.', CurrentLine));
  1611.                         exit(PreScan1);
  1612.                     end;
  1613.                 if (not InString) and (c = '{') then begin
  1614.                         InComment := true;
  1615.                         StartComment := i;
  1616.                     end;
  1617.                 if inComment then begin
  1618.                         if (c = '{') and (i <> StartComment) then begin
  1619.                                 PutMessage(concat('Comments cannot be nested.', CurrentLine));
  1620.                                 exit(PreScan1);
  1621.                             end;
  1622.                         if c = '}' then
  1623.                             inComment := false;
  1624.                         if c <> cr then
  1625.                             MacroBufP^[i] := ' ';
  1626.                     end
  1627.                 else begin
  1628.                         if (c = '‘') or (c = '`') then begin
  1629.                                 pc := i;
  1630.                                 PutMessage(concat('Bad quote("‘" or "`") in line ', long2str(LineNumber), ' of macro file.', CurrentLine));
  1631.                                 exit(PreScan1);
  1632.                             end;
  1633.                         if c = '''' then
  1634.                             inString := not inString;
  1635.                         if (c >= 'A') and (c <= 'Z') and not inString then
  1636.                             MacroBufP^[i] := chr(ord(c) + 32);
  1637.                     end;
  1638.             end;
  1639.         if inComment then begin
  1640.                 pc := StartComment;
  1641.                 PutMessage(concat('The comment starting in line ', long2str(LineNumber), ' of the macro file is not terminated.', CurrentLine))
  1642.             end
  1643.         else
  1644.             PreScan1 := true;
  1645.     end;
  1646.  
  1647.  
  1648.     procedure StoreInteger (i: integer);
  1649.     begin
  1650.         with macrosP^ do begin
  1651.                 pc2 := pc2 + 1;
  1652.                 macros[pc2] := chr(band(bsr(i, 8), $ff));
  1653.                 pc2 := pc2 + 1;
  1654.                 macros[pc2] := chr(band(i, $ff));
  1655.             end;
  1656.     end;
  1657.  
  1658.  
  1659.     procedure StoreReal (r: real);
  1660.         var
  1661.             i: LongInt;
  1662.     begin
  1663.         i := LongInt(r);
  1664.         with macrosP^ do begin
  1665.                 pc2 := pc2 + 1;
  1666.                 macros[pc2] := chr(band(bsr(i, 24), $ff));
  1667.                 pc2 := pc2 + 1;
  1668.                 macros[pc2] := chr(band(bsr(i, 16), $ff));
  1669.                 pc2 := pc2 + 1;
  1670.                 macros[pc2] := chr(band(bsr(i, 8), $ff));
  1671.                 pc2 := pc2 + 1;
  1672.                 macros[pc2] := chr(band(i, $ff));
  1673.             end;
  1674.     end;
  1675.  
  1676.  
  1677.     procedure StoreString;
  1678.         var
  1679.             i: integer;
  1680.     begin
  1681.         with macrosP^ do begin
  1682.                 for i := 1 to length(TokenStr) do begin
  1683.                         pc2 := pc2 + 1;
  1684.                         macros[pc2] := TokenStr[i];
  1685.                     end;
  1686.                 pc2 := pc2 + 1;
  1687.                 macros[pc2] := chr(0);
  1688.             end;
  1689.     end;
  1690.  
  1691.  
  1692.     procedure AddMenuItem;
  1693.         var
  1694.             i, fkey: integer;
  1695.             c, key: char;
  1696.     begin
  1697.         with MacrosP^ do begin
  1698.                 GetToken;
  1699.                 pc2 := pc2 + 1;
  1700.                 macros[pc2] := chr(ord(token));
  1701.                 if token <> StringLiteral then begin
  1702.                         LTMacroError('Macro command name not found');
  1703.                         exit(AddMenuItem);
  1704.                     end;
  1705.                 StoreString;
  1706.                 if nMacros < MaxMacros then begin
  1707.                         AppendMenu(SpecialMenuH, TokenStr);
  1708.                         nMacros := nMacros + 1
  1709.                     end
  1710.                 else
  1711.                     PutMessage('Too many macros.');
  1712.                 if macros[pc] = ';' then
  1713.                     pc := pc + 1;
  1714.                 MacroStart[nMacros] := pc2 + 1;
  1715.                 i := pos('[', TokenStr);
  1716.                 if i > 0 then begin {Assign a key to macro?}
  1717.                         i := i + 1;
  1718.                         key := TokenStr[i];
  1719.                         if (key >= 'A') and (key <= 'Z') then
  1720.                             key := chr(ord(key) + 32);
  1721.                         MacroKey[nMacros] := key;
  1722.                         if (key = 'f') and (TokenStr[i + 1] in ['1'..'9']) then begin {Function Key?}
  1723.                                 fkey := ord(TokenStr[i + 1]) - ord('0');
  1724.                                 if TokenStr[i + 2] in ['0'..'5'] then
  1725.                                     fkey := fkey * 10 + ord(TokenStr[i + 2]) - ord('0');
  1726.                                 if (fkey >= 1) and (fkey <= 15) then
  1727.                                     MacroKey[nMacros] := chr(ord('A') + fkey - 1);
  1728.                             end; {Function key?}
  1729.                     end;
  1730.             end; {with}
  1731.     end;
  1732.  
  1733.  
  1734.     procedure PreScan2;
  1735.   {Converts the macro file to a token stream. Some tokens are followed by an argument.}
  1736.   {<StringT> is followd by a null terminated string, <NumericLiteral> by a real(4 byte) number,}
  1737.   {<Identifier> and <ProcedureT> by a symbol table location(2 byte integer), and}
  1738.   {<CommandT>, <FunctionT>, <StringFunctionT>, and <ArrayT> by a 2 byte ID.}
  1739.   {UserCommandT, UserFuncT, UserStrFuncT are also followed by a 2 byte ID.}
  1740.         var
  1741.             i: integer;
  1742.     begin
  1743.         with MacrosP^ do begin
  1744.                 if nMacros > 0 then
  1745.                     for i := 1 to nMacros do begin
  1746.                             DelMenuItem(SpecialMenuH, FirstMacroItem);
  1747.                             MacroKey[i] := chr(0);
  1748.                         end;
  1749.                 nMacros := 0;
  1750.                 nProcedures := 0;
  1751.                 nGlobals := 0;
  1752.                 if TopOfStack > 0 then
  1753.                     DeallocateStrings2(1, TopOfStack);
  1754.                 TopOfStack := 0;
  1755.                 MacroOrProcName := BlankSymbol;
  1756.                 pc := 0;
  1757.                 pc2 := 0;
  1758.                 token := NullT;
  1759.                 SymbolTableLoc := 0;
  1760.                 MacroLineNumber := 1;
  1761.                 repeat
  1762.                     GetToken;
  1763.                     macros[pc2] := chr(ord(token));
  1764.                     case token of
  1765.                         StringLiteral: 
  1766.                             StoreString;
  1767.                         NumericLiteral: 
  1768.                             StoreReal(StringToReal(TokenStr));
  1769.                         MacroT:  begin
  1770.                                 AddMenuItem;
  1771.                                 if token = DoneT then
  1772.                                     exit(PreScan2);
  1773.                             end;
  1774.                         Identifier, ProcedureT: 
  1775.                             StoreInteger(SymbolTableLoc);
  1776.                         UnknownIdentifier:  begin
  1777.                                 AddIdentifier;
  1778.                                 if token = DoneT then
  1779.                                     exit(PreScan2);
  1780.                                 macros[pc2] := chr(ord(Identifier));
  1781.                                 StoreInteger(nSymbols);
  1782.                             end;
  1783.                         ProcIDT:  begin
  1784.                                 AddProcedure;
  1785.                                 if token = DoneT then
  1786.                                     exit(PreScan2);
  1787.                             end;
  1788.                         VarT: 
  1789.                             if (nMacros = 0) and (nProcedures = 0) then begin
  1790.                                     DoGlobalDeclarations;
  1791.                                     if token = DoneT then
  1792.                                         exit(PreScan2);
  1793.                                 end;
  1794.                         CommandT, FunctionT, StringFunctionT, ArrayT, UserCommandT, UserFuncT, UserStrFuncT: 
  1795.                             StoreInteger(ord(MacroCommand));
  1796.                         otherwise
  1797.                             ;
  1798.                     end; {case}
  1799.                     pc2 := pc2 + 1;
  1800.                     if pc2 > (MaxMacroSize - 256) then begin
  1801.                             if nMacros > 0 then
  1802.                                 DelMenuItem(SpecialMenuH, FirstMacroItem + nMacros - 1);
  1803.                             PutMessage('Unable to load all the macros because file is too large.');
  1804.                             exit(PreScan2);
  1805.                         end;
  1806.                 until token = DoneT;
  1807.                 EndMacros := pc2 - 1;
  1808.             end;
  1809.         if nMacros = 0 then
  1810.             PutMessage('No macros found.');
  1811.     end;
  1812.  
  1813.  
  1814.     procedure LoadMacros2;
  1815.     begin
  1816.         ShowWatch;
  1817.         if not PreScan1 then begin
  1818.                 DisposPtr(ptr(MacroBufP));
  1819.                 exit(LoadMacros2);
  1820.             end;
  1821.         InitSymbolTable;
  1822.         PreScan2;
  1823.         DisposPtr(ptr(MacroBufP));
  1824.         CurrentX := 20;
  1825.         CurrentY := 20;
  1826.         SaveForeground := -1;
  1827.         StartOfLine := 0;
  1828.     end;
  1829.  
  1830.  
  1831.     procedure LoadMacrosFromFile (fname: str255; RefNum: integer);
  1832.         var
  1833.             err: OSErr;
  1834.             FileSize: LongInt;
  1835.             f: integer;
  1836.     begin
  1837.         err := FSOpen(fname, RefNum, f);
  1838.         err := GetEOF(f, FileSize);
  1839.         if FileSize > MaxMacroFileSize then begin
  1840.                 err := fsclose(f);
  1841.                 PutMessage('Macro file is too large.');
  1842.                 exit(LoadMacrosFromFile);
  1843.             end;
  1844.         MacroBufP := MacroBufPtr(NewPtr(FileSize));
  1845.         if MacroBufP = nil then begin
  1846.                 err := fsclose(f);
  1847.                 PutMessage('Not enough memory to load macro file.');
  1848.                 exit(LoadMacrosFromFile);
  1849.             end;
  1850.         err := SetFPos(f, fsFromStart, 0);
  1851.         err := fsRead(f, FileSize, ptr(MacroBufP));
  1852.         EndMacros := FileSize - 1;
  1853.         err := fsclose(f);
  1854.         LoadMacros2;
  1855.     end;
  1856.  
  1857.  
  1858.     procedure LoadMacrosFromWindow;
  1859.         var
  1860.             ByteCount: LongInt;
  1861.     begin
  1862.         if TextInfo <> nil then
  1863.             with TextInfo^ do begin
  1864.                     ByteCount := TextTE^^.TELength;
  1865.                     if ByteCount <= 0 then begin
  1866.                             PutMessage('Text window is empty.');
  1867.                             exit(LoadMacrosFromWindow);
  1868.                         end;
  1869.                     EndMacros := ByteCount - 1;
  1870.                     MacroBufP := MacroBufPtr(NewPtr(ByteCount));
  1871.                     if MacroBufP = nil then begin
  1872.                             PutMessage('Not enough memory to load macros.');
  1873.                             exit(LoadMacrosFromWindow);
  1874.                         end;
  1875.                     BlockMove(TextTE^^.hText^, ptr(MacroBufP), ByteCount);
  1876.                     LoadMacros2;
  1877.                 end;
  1878.     end;
  1879.  
  1880.  
  1881.     procedure LoadMacros;
  1882.         var
  1883.             name: str255;
  1884.     begin
  1885.         if CurrentWindow = TextKind then
  1886.             LoadMacrosFromWindow
  1887.         else if GetTextFile(name, MacrosRefNum) then
  1888.             LoadMacrosFromFile(name, MacrosRefNum);
  1889.     end;
  1890.  
  1891.  
  1892. end.